\section{Etapas}

El lenguaje C-- es un subconjunto del lenguaje C, pero sin algunas partes del mismo, tales
como convenciones lexicas, sintaxis y semantica 

\subsection{Analisis Lexicografico}

Esta estapa es la primera que se realiza cuando se quiere desarrollar un compilar. La misma
la realizamos usando la herramienta flex, para generar un  analisis lexico de un archivo de 
texto que contiene el codigo C-- reconociendo los tokens que se utilizarian en la siguiente 
etapa. Estos tokens son las diferentes palabras claves reservadas del lenguaje, simbolos
utilizados para asignaciones y operaciones logicas, etc...

\subsubsection*{Dificultades}

En esta etapa la mayor dificultad fue definir los comentarios y los numeros de tipo float 
para que flex los pudiera reconocer.

\subsection{Analisis Sintactico}

En esta etapa definimos la gramatica de C-- utilizando la herramienta Yacc. Con los tokens
que producimos en la etapa anterior, pudimos verificar si la gramatica del codigo C-- que 
se encuentra en el archivo es correcto y en caso contrario informar el error.  

\subsubsection*{Dificultades}

Una de las dificultades que nos topamos en esta etapa, fue la de poder informar de manera
correcta la linea y el token culpable del error en la gramatica. Tambien resulto dificultoso
poder definir de manera adecuada la gramatica de los IF anidados como asi tambien de los
While.

\subsection{Analisis Semantico}

El analisis semantico es la etapa posterior al analisis sintactico. Se trata de determinar
los resultados intermedios, comprobar si los argumentos que tiene una operacion son los 
correctos, y si son compatibles entre si, etc. En definitiva, comprobara si el significado
de lo que se va leyendo es valido.

\subsubsection*{Dificultades}

En esta etapa nos encontramos con la dificultad de crear una estructura auxiliar en lenguaje
C para poder ir guardando en esta las variables con su tipo, para luego consultar en esta 
estructura el tipo de una variable cuando es usada como argumento de una operacion para 
verificar que son del mismo tipo.

\subsection{Generacion de codigo intermedio}

El objetivo de esta etapa fue la generacion de codigo intermedio para codigo C--. Consta de 
de una representacion intermedia explicita del programa fuente. Se puede considerar esta 
representacion intermedia como un programa para una maquina abstracta. 


\subsubsection*{Dificultades}

La dificultad de esta etapa fue la implementacion de el codigo intermedio en si, ya que 
estructuras de iteracion y control, como los if y los whiles, llevan unos label para tener
el control a donde se debe hacer jump para continuar con la ejecucion del codigo intermedio.

\subsubsection{Generacion de codigo objeto para numeros enteros}

En una primera parte generamos el codigo intermedio para las operaciones para numeros 
enteros unicamente. Codigo para operaciones como la suma, resta, division y tambien
para las operaciones exclusivas para enteros como Mod

\subsubsection*{Dificultades}

La dificultad de esta etapa fue la creacion del codigo objeto por cada operacion del codigo
intermedio. En esta etapa tuvimos la mayor cantidad de problemas ya que el codigo objeto
que nosotros construiamos no era el mismo que el generaba C, produciendo numerosos errores
que nos costo resolver. Tambien tuvimos muchos problemas cuando intentamos resolver en 
codigo objeto los distintos label que se fueron creando.
 
\subsubsection{Generacion de codigo objeto para numeros reales}

La generacion de codigo objeto se dividio en dos partes, una primera para los numeros enteros
y otra segunda parte para los numeros reales con sus respectivas operaciones en assembler. 


\subsubsection*{Dificultades}

En esta etapa nos encontramos con la dificultad de definir las distintas operaciones de en
codigo objeto para los numeros reales. Al no ser las mismas operaciones para enteros, las 
operaciones con reales son un poco mas complicadas, por lo tanto definirlas y probarlas y que
el resultado sea el esperado nos costo bastante.


\subsection{Testing}

En la etapa de testing, en base a varios ejemplos que funcionan correctamente del lenguaje C--,
con nuestro compilador genereamos el assembler de estos ejemplos, y con un script los ejecutamos
a ese codigo y pudimos ver si funcionaba correctamente lo que habiamos construido.

\subsubsection*{Dificultades}

La mayor dificultad fue cuando corrimos los ejemplos, se encontraban numerosos errores que nos 
resulto dificil encontrar y arreglarlo. Nos llevo bastante tiempo esta tarea. 
